using FSM.Model;

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;

namespace FSM.IBll
{
    public interface ITbFileBll
    {
        #region 查询 
        /// <summary> 
        /// 根据键值查询单个信息 
        /// </summary> 
        /// <param name="id">键值</param> 
        /// <returns></returns> 
        tb_file Get(int id);

        /// <summary>
        /// 根据文件/文件夹姓名获得文件信息
        /// </summary>
        /// <param name="upid">上级文件夹ID</param>
        /// <param name="name">文件/文件夹名称</param>
        /// <returns></returns>
        tb_file GetByName(int upid, string name);

        /// <summary> 
        /// 分页查询批量信息 
        /// </summary> 
        /// <param name="dir">文件/文件夹所在目录</param>
        /// <param name="upid">上级键值</param> 
        /// <param name="name">名称</param> 
        /// <param name="type">1：文件夹 2：文件</param> 
        /// <param name="level">文件/文件夹的层级</param>
        /// <param name="orderName">排序名称</param>
        /// <param name="orderType">
        /// 排序类型
        /// null: 默认排序
        /// 0：升序
        /// 1：降序
        /// </param>
        /// <param name="page">页码</param> 
        /// <param name="page_size">每页显示的条数</param> 
        /// <returns></returns> 
        Tuple<List<tb_file>, int> ListPagin(string dir, int? upid, string name, int? type, ushort? level, string orderName, int? orderType, int page, int page_size);

        /// <summary> 
        /// 分页查询批量信息 
        /// </summary> 
        /// <param name="dir">文件/文件夹所在目录</param>
        /// <param name="upid">上级键值</param> 
        /// <param name="name">名称</param> 
        /// <param name="type">1：文件夹 2：文件</param> 
        /// <param name="level">文件/文件夹的层级</param>
        /// <returns></returns> 
        List<tb_file> List(string dir, int? upid, string name, int? type, ushort? level);

        ///// <summary> 
        ///// 查询批量信息 
        ///// </summary> 
        ///// <param name="upid">上级键值</param> 
        ///// <param name="name">名称</param> 
        ///// <param name="type">1：文件夹 2：文件</param> 
        ///// <returns></returns> 
        //List<tb_file> List(int? upid, string name, int? type);

        /// <summary>
        /// 获得文件夹信息及其子文件夹及子文件信息
        /// </summary>
        /// <param name="id">文件夹ID</param>
        /// <returns></returns>
        tb_file ListCascade(int id);

        /// <summary>
        /// 判断文件是否存在
        /// </summary>
        /// <param name="upid">上级文件夹ID</param>
        /// <param name="name">文件名称</param>
        /// <returns></returns>
        bool Exists(int upid, string name);

        #endregion

        #region 提交 
        /// <summary> 
        /// 添加新的文件/文件夹
        /// 判断文件/文件夹的名称在当前文件夹下是否存在
        /// 如果存在，则判断是否是点击新增按钮的操作
        ///           如果是，判断文件夹的名称是否是【新增文件夹】
        ///                   如果是则查询【新增文件夹[index]】中最大的index，在index后页加1
        ///           如果不是则抛出异常信息
        /// 如果不存在，则进行插入操作
        /// </summary> 
        /// <param name="model">实体</param> 
        /// <returns></returns> 
        bool Insert(tb_file model);

        /// <summary> 
        /// 更新当前列表数据 
        /// </summary> 
        /// <param name="model">实体</param> 
        /// <returns></returns> 
        bool Update(tb_file model);

        /// <summary>
        /// 更新文件/文件夹名称
        /// 
        /// 先查询新的名称是否与再有名称一致，如果一致则不进行操作
        /// 如果名称不一致，判断当前名称是否已存在
        ///                 如果存在，则抛出异常
        ///                 如果不存在，则进行更新操作
        /// </summary>
        /// <param name="oper">操作人员</param>
        /// <param name="id">文件/文件夹ID</param>
        /// <param name="name">新的文件/文件夹名称</param>
        /// <returns></returns>
        bool UpdateFileName(string oper, int id, string name);

        /// <summary> 
        ///  删除 
        /// </summary> 
        /// <param name="oper">操作人员</param>
        /// <param name="id_arr">键值</param> 
        /// <returns></returns> 
        bool DeleteForVirual(string oper, params int[] id_arr);

        /// <summary>
        /// 删除记录
        /// </summary>
        /// <param name="id">记录ID</param>
        /// <returns></returns>
        bool DeleteById(int id);

        /// <summary>
        /// 还原文件/文件夹
        /// </summary>
        /// <param name="oper">操作人员</param>
        /// <param name="idList">文件/文件夹id列表</param>
        /// <param name="userDealTypes">用户选择的处理方式</param>
        /// <returns></returns>
        bool RestoreFiles(string oper, IEnumerable<int> idList, List<PubKeyValue<int, UserDealFileTypeEnum>> userDealTypes);

        /// <summary>
        /// 移动指定文件/文件夹到目标文件夹
        /// </summary>
        /// <param name="oper">操作人员</param>
        /// <param name="moveId">要移动的文件/文件夹ID</param>
        /// <param name="targetId">目标文件夹ID</param>
        bool MoveTo(string oper, int moveId, int targetId);

        /// <summary> 
        /// 获得要导出的数据的Excel字节 
        /// </summary> 
        /// <param name="upid">上级键值</param> 
        /// <param name="name">名称</param> 
        /// <param name="type">1：文件夹 2：文件</param> 
        /// <returns></returns> 
        byte[] Export(int? upid, string name, int? type);
        #endregion

        #region 扩展方法

        /// <summary>
        /// 更新所在文件夹的大小
        /// </summary>
        /// <param name="oper">操作人员</param>
        /// <param name="upid">所在文件夹ID</param>
        /// <param name="date">变动日期</param>
        /// <returns></returns>
        bool UpdateUpFolderSize(string oper, int upid, DateTime date);

        /// <summary>
        /// 创建压缩文件
        /// </summary>
        /// <param name="path">文件夹全路径</param>
        /// <returns></returns>
        Task<byte[]> CreateZipArchive(string basePath, int id);

        /// <summary>
        /// 创建压缩文件
        /// </summary>
        /// <param name="basePath">文件/文件夹的要目录</param>
        /// <param name="idArr">文件/文件夹ID数组</param>
        /// <returns></returns>
        Task<byte[]> CreateZipArchive(string basePath, int[] idArr);

        /// <summary>
        /// 判断要还原的文件/文件夹在原有的记录中是否存
        /// </summary>
        /// <param name="id">要还原的文件/文件夹ID</param>
        /// <returns>
        /// 返回有重复记录的原记录中的记录信息
        /// </returns>
        List<KeyValuePair<int, string>> CheckFilesExists(int id);

        #endregion
    }
}
